package com.winning.core.log;

import java.lang.reflect.Method;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import com.framework.base.inter.ILogAOPService;

/**
 * 类名称：LogAOPService
 * 类描述：   日志拦截器，利用Spring AOP拦截指定服务，输出固定格式的日志结果
 * 创建人：liuwensheng
 * 创建时间：2015-2-3 下午3:58:03
 * 修改人：liuwensheng
 * 修改时间：2015-2-3 下午3:58:03
 * 修改备注：
 */
@Component(value = "logMessageInterceptor")
public class LogAOPService implements ILogAOPService {
    private static Logger LOGGER = Logger.getLogger(LogAOPService.class);

    /**
     * 有参的日志方法
     *
     * @param point
     * @throws Throwable
     */
    public void logArg(JoinPoint joinPoint) {
        // 获取连接点的方法签名对象
        MethodSignature joinPointObject = (MethodSignature) joinPoint.getSignature();
        // 连接点对象的方法
        Method method = joinPointObject.getMethod();

        String argsStr = getArgStr(joinPoint);

        //输出Flex目标服务名称
        LOGGER.info("--> Target Servcie:" + joinPoint.getTarget().getClass().getName() + "." + method.getName() + "(" + argsStr + ")");
    }

    /**
     * 有参有返回值的方法
     *
     * @param point
     * @param returnObj
     * @throws Throwable
     */
    public void logArgAndReturn(JoinPoint joinPoint, Object returnObj) {
        String argsStr = getArgStr(joinPoint);

        // 获取连接点的方法签名对象
        MethodSignature joinPointObject = (MethodSignature) joinPoint.getSignature();
        // 连接点对象的方法
        Method method = joinPointObject.getMethod();

        //输出Flex目标服务名称
        LOGGER.info("--> Target Servcie:" + joinPoint.getTarget().getClass().getName() + "." + method.getName() + "(" + argsStr + ") Retrun: " + returnObj);
    }

    private String getArgStr(JoinPoint point) {
        String argsStr = "";

        //此方法返回的是一个数组，数组中包括request以及ActionCofig等类对象
        Object[] args = point.getArgs();

        if (args != null) {
            for (Object obj : args) {
                if (null != obj) {
                    argsStr += obj.getClass() + ":" + obj + ",";
                }
            }
            if (argsStr.length() > 0) {
                argsStr = argsStr.substring(0, argsStr.length() - 1);
            }
        }

        return argsStr;
    }

}
